iT邦幫忙

0

Python & Celery 學習筆記_重試策略 (retry)

  • 分享至 

  • xImage
  •  

本篇文章在介紹 celery 的重試策略,如果有問題或是錯誤,歡迎留言討論!!

一、簡介

稍微在網路上搜尋了一下,Celery 的 retry 大致上可以分為兩種,第一種為調用任務時,可以設定參數,此參數主要在控制建立任務連線 (也就是派送任務時),第二種則是在任務執行的時候,任務本身發生錯誤所需要的 retry

二、發送任務的 retry

在調用任務時,可以設定的重試參數分別有

  • max_retries: 最大重試次數,預設為 3 次
  • interval_start: 兩次重試之間等待的秒數,預設為 0 秒,可接收浮點數
  • interval_step: 兩次重試之間等待的秒數會增加的秒數,ex interval_start = 2, interval_step = 3,則下次重試會於 5 秒後開始,下下次會於 8 秒後開始
  • interval_max: 用於控制兩次重試之間等待的最大秒數

**請注意這個方法適用在,建立與 worker 連線的時候的重試,並不是任務本身運行過程發生錯誤會重試的設定
**
下面為程式碼範例

from task import get_result

retry_policy = {'max_retries': 2,
                'interval_start': 5}

test_task = get_result.apply_async((10, 0), retry=True, retry_policy=retry_policy)

三、任務運行中碰到錯誤的 retry

若想要讓任務本身運行碰到錯誤會進行 retry 則需要在任務內進行設定

(一)、建立任務

解釋:

  1. 透過設定 bind=True 可以讓我們訪問 self,可以看到在建立任務的時候多了 self 參數
  2. 透過設定 default_retry_delay 可以控制兩次重試間的間隔
  3. 透過設定 retry_kwargs 可以控制 retry 相關設定

注意:
default_retry_delay 不能寫進 retry_kwargs 內

from celery import Celery
from setting import broker_url, backend_url
from datetime import datetime

app = Celery("celery_start", broker=broker_url, backend=backend_url)

retry_kwargs = {"max_retries": 3,
                "retry_backoff": False}


@app.task(bind=True, default_retry_delay=10, retry_kwargs=retry_kwargs)
def get_result(self, x, y):
    print(datetime.now())
    try:
        tmp = x / y
        return tmp
    except Exception as ex:
        self.retry(exc=ex)

下圖中我們可以看到,celery 在收到任務後會先執行第一次,直到碰到錯誤後,開始進行重試
因此總共執行次數為 4 次
https://ithelp.ithome.com.tw/upload/images/20220319/20144024V5F8rTfnSP.jpg

(二)、retry_kwargs 控制項 (根據 package 內說明所列)

  • args: 同 apply_async 送的參數
  • kwargs: 同 apply_async 送的參數
  • exc: 發生錯誤時,會回傳的訊息
  • throw: 為一個布林值,若設為 false 當任務發生錯誤,不會丟出錯誤訊息,只會將任務標記為 retry 直到 retry 次數用盡 or 成功
  • eta: 同 apply_async 送的參數
  • countdown: 同 apply_async 送的參數
  • max_retries: 最大 retry 次數

(三)、其他常用參數

  1. autoretry_for
    當發生指定錯誤時,會自動進行 retry 不需要再撰寫 self.retry()
from requests.exceptions import RequestException

@app.task(autoretry_for=RequestException)

若想自動 retry 任何錯誤則

@app.task(autoretry_for=Exception)
  1. retry_backoff
    功能同 retry 模組的 backoff 會以指數型態增加兩次 retry 間隔
    ex: backoff = 2 且兩次 retry 間隔 1 秒,則第一次為 1 秒,第二次為 2 秒,第三次為 4 秒以此類推
@app.task(retry_backoff=2)
  1. retry_backoff_max
    設定等待最大秒數上限,單位為秒,預設為 600 也就是 10 分鐘
@app.task(retry_backoff_max=600)

四、參考文獻

https://coderbook.com/@marcus/how-to-automatically-retry-failed-tasks-with-celery/


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言